perm filename NPROM.FAI[CMS,LCS] blob sn#473137 filedate 1979-09-10 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00012 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		NEW MONITOR AND BOOTSTRAP PROM.
C00003 00003	RESET
C00005 00004	Disk load routine
C00007 00005	START
C00009 00006	Clear screen sub
C00010 00007	Display DDT
C00012 00008	CKCMD:	CMPI	"/"	Examine
C00013 00009	PRINT ADDRESS/VAL
C00015 00010	Reset chr dpy
C00017 00011	DISPLAY CHR
C00019 00012	Paper tape loader	Interupt driven?
C00020 ENDMK
C⊗;
;	NEW MONITOR AND BOOTSTRAP PROM.

	.INSERT ASMBL.FAI

; ZPAGE RAM

TFLG:	0
VAL:	0
ADR:	0
	0

	BLOCK 15	;OLD DDT RAM

CUR:	0	;Cursor
	0
SD:	0	;Screen edges
ED:	0

RAS:	0	;Dpy control defaults
ROW:	0
DPY:	0
MIX:	0

BRCODE:	0	;Default bit rate
RSCODE:	0	;Default acia control word
KBCODE:	0	;Default keyboard control word
;RESET
LOC 177274	;LOC 177000
   SRSTR←UNDEF	;System reset register
   RSTREG←UNDEF	;POWER ON RESET REG

PORCK:	BIT	RSTREG	;Check if power on reset
	BVS	CKMODE

RST:	LDXI	377	;Stack depth
	TXS		;Set stack
	CLD		;Clear decimal mode

	JSR	CLRDPY	;Clear screen
	JSR	SETVEC	;Setup default IRQ vectors
	JSR	JMPSET	;Reset ram jumps
		;Setup start addresses

;CKMODE:	PHA	;Save A??
		;Reset system
	LDA	RSTREG
	ANDI	60	;RST mode bits
	BNE	CKM1
	JMP	OLDDDT	;Old DDT
CKM1:	CMPI	40
	BCS	CKM2
	JMP	LEDDDT	;KB LED DDT
CKM2:	BNE	FBOOT
	JMP	DPYDDT	;Display DDT

   DSKSEL←176437;Floppy select
   FBAD←1400	;Floppy bootstrap start address
   IBMR←163	;IBM read command

FBOOT:	LDAI	RTI	;Dissable non maskable interupt
	STA	NMIV
	JSR	RESTOR	;Restore?
		;Seek track
	BIT	RSTREG	;Check if power on reset
	BVS	NOPOR
		;Wait for disk

NOPOR:	LDAI	0	;Floppy boot start addr. low
	STAZ	FBADL
	LDAI	2	;Fboot start addr. high
	STAZ	FBADH
	LDXI	1	;Number of sectors
	LDAI	IBMR	;Read IBM sector
	STAZ	FDC

	JSR	FLOAD	;Load from disk
		;Check for error

	JMP	FBAD
;Disk load routine
   FDSKC←176420	;DISK COMMAND REGISTER
   FDSKT←176421	;DISK TRACK REGISTER
   FDSKS←176422	;DISK SECTOR REGISTER
   FDSKD←176423	;DISK DATA REGISTER
FLOAD:	LDAI	34	;Reset disk servo
	STA	DSKSEL
	LDAZ	DSEL	;20 = Head unloaded and
	STA	DSKSEL	;disk init disabled.

	LDAZ	SEC
	STA	FDSKS	;Setup sector #
		;Init data reg?

	LDXI	2	;Setup timer jump
JLOOP:	LDAX	RJMP
	STAX	NMIV
	DEX
	BPL	JLOOP

	LDAI	UNDEF
	STA	RTCAH	;Setup time out
	LDAI	17	;17 = Load, /16, NMI, IEN
	STA	RTCAC

	LDAI	163	;Read 1 IBM sector (128 bytes)
	STA	FDSKC

	LDYI	0
DSKL:	BIT	DSKSEL	
	BPL	DSKL	;Wait until byte ready
	LDA	FDSKD
	STAIY	FBAD	;Load it
	INY
	BNE	DSKL

	LDAI	0
RSTT:	LDXI	0	;Disable timer
	STA	RTCAC
		;Set / reset error bits
	RTS

RJMP:	JMP	FBTO

FBTO:	PLA		;Flush stack
	PLA
	PLA
	LDAI	TOBIT	;Set time out error bit
	JMP	RSTT
;START
   BOOTS←1000	;BOOTSTRAP START ADDRESS
DMAINT:
DSKINT:	
	JMP	BOOTS	;JUMP TO BOOT START

;Reset ram jumps.
JMPSET:	LDXI	UNDEF	;Number of jumps * 2
JSET:	LDAX	JMPDEF
	STAZX	RJMP	;Jump table setup loop
	DEX
	BPL	JSET
	RTS

;Default ram jumps
JMPDEF:	

;Setup interrupt vectors.
   IVECT←176360	;Ram interrupt vector table address
SETVEC:	LDXI	17	;Number of vectors * 2
IVSET:	LDAX	IVDEF	;Default vector setup loop
	STAX	IVECT
	DEX
	BPL	IVSET

   PRIC←176436	;PRI control register
	LDAI	UNDEF	;Setup pri control register.
	STA	PRIC
	RTS

;Default interupt vectors.
IVDEF:	IVERR	;Error
	PROM
	IVERR	;Error
	PROM
	UNLOAD	;Disable head preload
	PROM
	MODINT	;TTY default
	PROM
	DMAINT	;Disk load and boot
	PROM
	DSKINT	;Disk load and boot
	PROM
;Clear screen sub
CLRDPY:	LDAI	0
	STAZ	CUR
	LDAZ	SD	;Get top of screen
	STAZ	CUR+1
	LDYI	0
	LDAI	" "	;<Space>
CLRL:	STAIY	CUR
	INY
	BNE	CLRL
	INCZ	CUR+1
	LDXZ	CUR+1
	CPXZ	ED	;Bottom of screen
	BCC	CLRL
	RTS

;SETUP DMA
   FDMAA←176400	;FDSK DMA ADDRESS REGISTER
   FDMAC←176401	;FDSK COUNT REGISTER
   DMACON←176410;DMA COMMAND REGISTER
	LDAI	0	;RESET DMA
	STA	DMACON
	STA	FDMAA	;SETUP DMA ADDRESS
	LDAI	2	;1000
	STA	FDMAA
	LDAI	377	;SETUP DMA COUNT
	STA	FDMAC
	LDAI	201	;CNT=512-1
	STA	FDMAC
	LDAI	141	;ENABLE FDSK DMA
	IVERR	;Error
;Display DDT
DPYDDT:	LDAI	20	;Unload disk head??
	STA	DSKSEL

	JSR	RCDPY	;Setup display defaults
		;Reset ACIA(S), BRG, MOD
		;Setup KB chr map?
DBRIN0:	PHA
	LDAI	RTI	;Disable NMI
	STA	NMIV
	PLA

DBRIN1:	JSR	SVSTAT	;Save state?

	JSR	SETKB
	JSR	SETDPY
		;Init I/O?
;DPY DDT loop
PCR:	LDAI	15	;PRINT <cr>.
	JSR	RPCHR
PLF:	LDAI	12
	JSR	RPCHR	;PRINT <cr>
GNEXT:	JSR	RGCHR	;Wait for next chr
	ANDI	177

;RAM JUMP

ECHO:	JSR	RPCHR	;Echo it
	CMPI	12	;<lf>
	BEQ	LF
	CMPI	60	;Check for octal digit
	BCC	CKCMD
	CMPI	70
	BCS	CKCMD

	ANDI	7
	LDXI	3
SHFT:	ASLZ	TMP
	ROLZ	TMP+1
	DEX
	BNE	SHFT

	ORAZ	TMP
	STAZ	TMP
	INCZ	TFLG	;Set number flag

	JMP	GNEXT	;Wait for next chr
CKCMD:	CMPI	"/"	;Examine
	BEQ	SETAD
	CMPI	UNDEF	;"↑"
	BEQ	UPARO
	CMPI	UNDEF	;<Tab>
	BEQ	TAB
	CMPI	UNDEF	;<Btab>
	BEQ	BTAB
	CMPI	UNDEF	;<Baddr>
	BEQ	BADDR
	CMPI	UNDEF	;<Jaddr>
	BEQ	JADDR
	CMPI	"P"	;Proceed
	BEQ	GO
	CMPI	"T"	;TTY
	BEQ	TTY
	CMPI	UNDEF	;TVT
	BEQ	TVT
	CMPI	"B"	;Modem boot
	BEQ	MBOOT
	CMPI	"L"	;Modem load
	BEQ	MLOAD
	CMPI	"U"	;Modem unload
	BEQ	MUNLOD

ERROR:	JMP	GNEXT
;PRINT ADDRESS/VAL
PAV:	LDXI	0
	LDAI	1	;# OF DIGITS
	STAZ	NDIG
	STAZ	TFLG	;SET BIT MASK
	LDYI	2	;# OF BITS + C
	JSR	RLOOP	;PRINT "0" OR "1"
	LDAI	5
	STAZ	NDIG
	LDAI	7
	STAZ	TFLG
	JSR	CLOOP	;PRINT 5 OCTAL DIGITS
	LDAI	"/"
	JSR	PCHR	;PRINT "/"
	LDAI	1
	STAZ	NDIG
	LDYI	3
	STYZ	TFLG
	JSR	DLOOP	;PRINT "0" - "3"
	LDAI	2
	STAZ	NDIG
	LDAI	7
	STAZ	TFLG
	JSR	CLOOP	;PRINT 2 OCTAL DIGITS
	RTS

CLOOP:	LDYI	3	;FOR 3 BITS PER DIGIT
RLOOP:	ROLZ	VAL	;ROTATE ADDRESS AND VALUE
	ROLZ	ADR
	ROLZ	ADR+1
DLOOP:	DEY
	BNE	RLOOP
	LDAZ	VAL	;GET NEXT DIGIT
	ANDZ	TFLG
	ORAI	60	;CONVERT TO ASCII
	JSR	RPCHR	;PRINT IT (Ram jump)
	DECZ	NDIG
	BNE	CLOOP	;NEXT DIGIT
	RTS
;Reset chr dpy
RCDPY:	LDAI	0	;Reset cursor
	STAZ	CUR
	LDAI	DPYRAM
	STAZ	CUR+1

   RASTER←171760;RASTER OFFSET
   CHRROW←171761;CHR ROW OFFSET
   DPYC←171764	;VIDIO CONTROL
   VMIX←171765	;VIDIO MIXER
	LDAI	14	;SET UP DPY DEFAULTS
	STAZ	RAS	;SHOULD BE 0,0
	LDAI	377
	STAZ	ROW
	LDAI	100	;CURSOR ENABLE
	STAZ	DPY
	LDAI	1	;NORMAL MIX
	STAZ	MIX

;Setup screen edges
	LDAI	200
	STAZ	SD	;Upper edge
	LDAI	210
	STAZ	ED	;lower edge

;Reset key board defaults
   KBD←173370	;KB DATA REGISTER
   KBC←173371	;KB CONTROL REGISTER
	LDAI	UNDEF	;RESET KB DEFAULT
	STAZ	KBCODE

	RTS

;Reset brate and acia defaults
   RSDEF←25	;ACIA CONTROL DEFAULT
RMOD:	LDAI	15	;Set bit rate to 300
	STAZ	BRCODE
	LDAI	RSDEF	;SETUP ACIA DEFAULT
	STAZ	RSCODE

	LDAI	3
	STA	ACIAC	;Reset ACIA?

	RTS
;DISPLAY CHR
PDPY:	LDYI	0	;?
	STAIY	CUR	;WRITE CHR INTO CHRDPY MEM

	INCZ	CUR	;INCREMENT CURSOR
	LDAZ	CUR
	ANDI	77	;CHECK IF OFF RIGHT EDGE
	BEQ	CRLF	;CLEAR NEXT LINE

   CURREG←171762	;CURSOR CONTROL REGISTERS
UPCUR:	LDAZ	CUR	;UPDATE CURSOR
	STA	CURREG
	LDAZ	CUR+1
	STA	CURREG+1
	RTS

CRLF:	LDAZ	CUR	;FIX CURSOR
	SEC
	SBCI	100	;Chr per line
	STAZ	CUR	;Fall through to line feed

;LINE FEED
LF:	CLC
	LDAZ	CUR
	ADCI	100	;NEXT LINE
	STAZ	CUR
	BCC	NOTOFF
	INCZ	CUR+1
	LDAZ	CUR+1
	CMPZ	ED	;BOTTOM OF SCREEN
	BEQ	GLITCH
;Clear to end of line sub
CTEOL:	LDAZ	CUR
	ANDI	77
	EORI	77
	TAY
	LDAI	40	;<space>
CLR:	STAIY	CUR
	DEY
	BNE	CLR
	RTS

GLITCH:	
	RTS
;Paper tape loader	Interupt driven?
PTLOAD:	
PTW1:	BIT	CRB0	;Wait  for chr
	BPL	PTW1
	LDA	PRA0	;Get chr
	CMPI	UNDEF
	BEQ	PTW1	;Check if record mark

		;Intel hex, PDP-11 bin, or ? (cksum, etc.)


;Prom reset and interupt vectors
   LOC 200266	;LOC 177772

NMIV:	NMIINT	;Prom Non maskable interupt vector
	PROM

RSTV:	RST	;Prom reset vector
	PROM

;Prom interupt request vector
IRQV:	0	;0 for PIV enable
	0
END